package com.yale.elasticsearch.service.query;

import com.yale.elasticsearch.dto.RangeQueryDTO;
import com.yale.elasticsearch.factory.RangeQueryFactory;
import com.yale.elasticsearch.factory.RangeQueryStrategy;
import com.yale.elasticsearch.model.entity.UserInfo;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.query_dsl.Query;
import co.elastic.clients.elasticsearch.core.SearchRequest;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.json.JsonData;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 范围查询
 */
@Slf4j
@Service
public class RangeQueryService {

    @Resource
    private ElasticsearchClient elasticsearchClient;

    /**
     * 范围查询
     */
    public Object rangeQuery(RangeQueryDTO rangeQueryDTO) {
        Object result = "";
        try {


            String startValue = null;
            String endValue = null;
            boolean useGte = false;
            boolean useLte = false;
            boolean useLt = false;
            boolean useGt = false;
            if (rangeQueryDTO.getGteValue() != null) {
                startValue = rangeQueryDTO.getGteValue();
                useGte = true;
            }
            if(rangeQueryDTO.getLteValue() != null){
                endValue = rangeQueryDTO.getLteValue();
                useLte = true;
            }
            if(rangeQueryDTO.getGtValue() != null && rangeQueryDTO.getGtValue().length() > 0){
                startValue = rangeQueryDTO.getGtValue();
                useGt = true;
            }
            if(rangeQueryDTO.getLtValue() != null){
                endValue = rangeQueryDTO.getLtValue();
                useLt = true;
            }
            // 构建 Range 查询条件
            RangeQueryStrategy strategy = RangeQueryFactory.getRangeQueryStrategy(useGte, useLte, useLt,useGt);
            Query rangeQuery = strategy.createRangeQuery(startValue, endValue,rangeQueryDTO.getField());
            // 创建查询请求对象
            SearchRequest searchRequest = SearchRequest.of(s -> s
                    .index(rangeQueryDTO.getIndexName())
                    .query(rangeQuery)
            );

            // 执行查询
            SearchResponse<JsonData> searchResponse = elasticsearchClient.search(searchRequest, JsonData.class);
            List<UserInfo> userInfoList = new ArrayList<>();
            // 处理响应结果
            if (searchResponse.hits().total().value() > 0) {
                searchResponse.hits().hits().forEach(hit -> {
                    // 将 JSON 转换成对象
                    UserInfo userInfo = JSON.parseObject(hit.source().toJson().toString(), UserInfo.class);
                    userInfoList.add(userInfo);
                    // 输出查询信息
                    log.info("打印查询结果：{}",JSON.toJSONString(userInfo));
                });
            }

            result = JSON.toJSONString(userInfoList);

        } catch (IOException e) {
           log.error("Error executing search request: {}" , e.getMessage());
        }
        return result;
    }


//    /**
//     * 查询距离现在 30 年间的员工数据
//     * [年(y)、月(M)、星期(w)、天(d)、小时(h)、分钟(m)、秒(s)]
//     * 例如：
//     * now-1h 查询一小时内范围
//     * now-1d 查询一天内时间范围
//     * now-1y 查询最近一年内的时间范围
//     */
//    public Object dateRangeQuery() {
//        Object result = "";
//        try {
//            // 构建 Date Range 查询条件
//            Query dateRangeQuery = Query.of(q -> q
//                    .range(r -> r
//                            .field("birthDate")
//                            .gte(JsonData.fromJson("now-30y"))
//                            .lte(JsonData.fromJson("now"))
//                    )
//            );
//
//            // 创建查询请求对象
//            SearchRequest searchRequest = SearchRequest.of(s -> s
//                    .index("mydlq-user")
//                    .query(dateRangeQuery)
//            );
//
//            // 执行查询
//            SearchResponse<JsonData> searchResponse = elasticsearchClient.search(searchRequest, JsonData.class);
//
//            // 处理响应结果
//            if (searchResponse.hits().total().value() > 0) {
//                searchResponse.hits().hits().forEach(hit -> {
//                    // 将 JSON 转换成对象
//                    UserInfo userInfo = JSON.parseObject(hit.source().toString(), UserInfo.class);
//                    // 输出查询信息
//                    System.out.println(userInfo.toString());
//                });
//            }
//
//            result = searchResponse.hits();
//
//        } catch (IOException e) {
//            System.err.println("Error executing search request: " + e.getMessage());
//        }
//        return result;
//    }

}
